﻿//#define _CRT_SECURE_NO_WARNINGS  1
////一定要动手，例子不管多么简单，建议至少自己手敲一遍看看是否理解了里头的细枝末节。
////一定要学会思考，思考为什么要这样，而不是那样。还要举一反三地思考
//#include"string.h"
//namespace jz {
//	//构造函数
//	string::string(const char* str)
//	{
//		size_t len = strlen(str);
//		_size = _capacity = len;
//		char* tem = new char[_capacity+1];
//		_str = tem;	
//		strcpy(_str, str);
//	}
//	//拷贝构造(深拷贝）
//	string::string(const string& s)
//	{
//		//重新开辟空间
//		char* tem = new char[s._capacity+1];
//		//拷贝到新空间
//		strcpy(tem, s._str);
//		//销毁旧空间
//		delete[] _str;
//		_str = tem;
//		_capacity = s._capacity;
//		_size = s._size;
//	}
//	//运算符重载  str1 = str2
//	string& string::operator=(const string& s)
//	{
//		//重新开辟空间
//		char* tem = new char[s._capacity+1];
//		//拷贝到新空间
//		strcpy(tem, s._str);
//		//销毁旧空间
//		delete[] _str;
//		_str = tem;
//		_capacity = s._capacity;
//		_size = s._size;//指向最后一个数据的下一个位置
//		return *this;
//	}
//	string::~string()
//	{
//		_size = _capacity = 0;
//		delete[]_str;
//		_str = nullptr;
//		
//	}
//	const char* string::c_str()const
//	{
//		return _str;
//	}
//	size_t string::capacity()const
//	{
//		return _capacity;
//	}
//	size_t string::size()const
//	{
//		return _size;
//	}
//
//	void string::reserve(size_t n)
//	{
//		if (n > _capacity)//n>当前容量才进行扩容
//		{
//			//重新开辟空间
//			char* tem = new char[n+3];
//			//拷贝到新空间
//			strcpy(tem, _str);
//			//销毁旧空间
//			delete[] _str;
//			_str = tem;
//			_capacity = n;
//		}
//	}
//	char& string::operator[](size_t index)
//	{
//		assert(index <= _size);
//		return *(this->_str + index);
//	}
//	const char& string::operator[](size_t index)const
//	{
//		assert(index <= _size);
//		return *(this->_str + index);
//	}
//	void string::push_back(char c)
//	{
//		if (_size>= _capacity)
//		{
//			//扩容
//			size_t newcapacity = _capacity == 0 ? 2 : _capacity*2;
//			reserve(newcapacity);
//		}
//		//尾插
//		_str[_size] = c;
//		_size++;
//		_str[_size] = '\0';
//	}
//	void string::append(const char* str)
//	{
//		size_t len = strlen(str);
//		if (len+_size>= _capacity)
//		{
//			//扩容
//			size_t newcapacity = len+_size;
//			reserve(newcapacity);
//		}
//		strcpy(_str + _size, str);
//		_size += len;
//
//	}
//	string& string::operator+=(char c)
//	{
//		this->push_back(c);
//		return *this;
//	}
//	string& string::operator+=(const char* str)
//	{
//		this->append(str);
//		return *this;
//	}
//	void string::clear()
//	{
//		_size = 0;
//		_str[_size] = '\0';
//	}
//	void string::swap(string& s)
//	{
//		std::swap(_str, s._str);
//		std::swap(_capacity, s._capacity);
//		std::swap(_size, s._size);
//	}
//	bool string::empty()const
//	{
//		if (_size == 0)
//		{
//			return true;
//		}
//		return false;
//	}
//	void string::resize(size_t n, char c)
//	{
//		if (_size >n)
//		{
//			for (size_t i = n; i < _size; i++)
//			{
//				_str[i] = c;
//			}
//		}
//		else if (n > _size && n < _capacity)
//		{
//			reserve(n);
//			memset(_str + _size,c , sizeof(n - _size));
//		}
//		else {
//			reserve(n);
//		}
//	}
//	bool string::operator<(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret < 0)
//		{
//			return false;
//		}
//		else
//		{
//			return true;
//		}
//	}
//
//	bool string::operator<=(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret>0)
//		{
//			return false;
//		}
//		else
//		{
//			return true;
//		}
//	}
//
//	bool string::operator>(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret > 0)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//
//	bool string::operator>=(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret >= 0)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//
//	bool string::operator==(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret = 0)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//
//	bool string::operator!=(const string& s)
//	{
//		int ret = strcmp(_str, s._str);
//		if (ret != 0)
//		{
//			return true;
//		}
//		else
//		{
//			return false;
//		}
//	}
//	// 返回c在string中第一次出现的位置
//
//	size_t string::find(char c, size_t pos) const
//	{
//		size_t it = _size;
//		for (size_t i = pos; i < _size; i++)
//		{
//			if (_str[i] == c)
//			{
//				return i;
//			}
//		}
//		return -1;
//	}
//
//	// 返回子串s在string中第一次出现的位置
//
//	size_t string::find(const char* s, size_t pos) const
//	{
//		char* it = strstr(_str + pos, s);
//		if (it == nullptr)
//		{
//			return -1;
//		}
//		else {
//			return (it - _str);
//		}
//	}
//
//	// 在pos位置上插入字符c/字符串str，并返回该字符的位置
//
//	string& string::insert(size_t pos, char c)
//	{
//		if (_size >= _capacity)
//		{
//			//扩容
//			size_t newcapacity = _capacity == 0 ? 2 : _capacity * 2;
//			reserve(newcapacity);
//		}
//		int end = _size;
//		while (end >= (int)pos)
//		{
//			_str[end + 1] = _str[end];
//			end--;
//		}
//		_str[pos] = c;
//		_size++;
//		return *this;
//
//	}
//
//	string& string::insert(size_t pos, const char* str)
//	{
//		size_t len = strlen(str);
//		if (len + _size >= _capacity)
//		{
//			//扩容
//			size_t newcapacity = len + _size;
//			reserve(newcapacity);
//		}
//		//挪动数据
//		int end = _size;
//		while (end >= (int)pos)
//		{
//			_str[end + len] = _str[end];
//			end--;
//		}
//		strncpy(_str + pos, str,len);
//		_size += len;
//		return *this;
//	}
//
//	// 删除pos位置上的元素，并返回该元素的下一个位置
//
//	string& string::erase(size_t pos, size_t len)
//	{
//		assert(pos <= _size);
//		if (len + pos > _size || len == std::string::npos)
//		{
//			_size = pos;
//			_str[_size] = '\0';
//		}
//		else
//		{
//			strcpy(_str + pos, _str + pos + len);
//		}
//		return *this;
//	}
//	ostream& operator<<(ostream& _cout, const jz::string& s)
//	{
//		for (const auto& it : s)
//		{
//			_cout << it;
//		}
//		return _cout;
//	}
//
//	 istream& operator>>(istream& _cin, jz::string& s)
//	{
//		 s.clear();
//		 char buff[128];
//		 char ch = _cin.get();
//		 size_t i = 0;
//		 while (ch != ' ' && ch != '\n')
//		 {
//			 if (i == 127)
//			 {
//				 //将字符数组中的字符放入s中
//				 buff[i] = '\0';
//				 s += buff;
//				 i = 0;
//			 }
//			 buff[i] = ch;
//			 i++;
//			 ch = _cin.get();
//		 }
//		 if (i != 0)
//		 {
//			 buff[i] = '\0';
//			 s += buff;
//		 }
//		 return _cin;
//	}
//
//	
//}
